<?php

namespace app\lib\pay;

use app\common\model\MbtiOrder;
use think\Exception;
use think\facade\Db;
use think\facade\Log;
use Yansongda\Pay\Pay;

class AliPay
{
    protected $app;

    public function getConf(){
        return [
            // 其他配置...
            'http' => [
                'verify' => false,
            ],
            'alipay' => [
                'default' => [
                    'verify_ssl' => false,  // 原为 true（默认开启）
                    // 「必填」支付宝分配的 app_id
                    'app_id' => env('alipay.app_id'),
                    // 「必填」应用私钥 字符串或路径
                    'app_secret_cert' => env('alipay.app_secret_cert'),
                    // 设置应用私钥后，即可下载得到以下3个证书
                    'app_public_cert_path' =>  app()->getAppPath().'/crt/appCertPublicKey_2021005126670928.crt',
                    // 「必填」支付宝公钥证书 路径
                    'alipay_public_cert_path' => app()->getAppPath().'/crt/alipayCertPublicKey_RSA2.crt',
                    // 「必填」支付宝根证书 路径
                    'alipay_root_cert_path' => app()->getAppPath().'/crt/alipayRootCert.crt',
                    'sign_type' => 'RSA2',
                    'return_url' => env('alipay.return_url'),
                    'notify_url' => env('alipay.notify_url'),
                    // 「选填」默认为正常模式。可选为： MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
                    'mode' => Pay::MODE_NORMAL,
                ]
            ]
        ];
    }
    public function __construct()
    {

        $this->app = $this->getConf();
    }

    /**
     * 手机网页和电脑网页支付
     * @param array $data
     * @param string $channelPay
     * @return string
     * @throws Exception
     */
    public function webPay($data = [],$channelPay = '')
    {
        try {
            $orderNo = (new MbtiOrder())->addData(
                $data['business_order_no'],
                $data['total_amount'],
                'alipay',
                0
            );
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            throw new Exception("下单失败");
        }
        $data['out_trade_no'] = $orderNo;
        if ($channelPay == "h5") {
           return Pay::alipay($this->app)->wap($data)->getBody();
        } else if ($channelPay == "web") {
            return Pay::alipay($this->app)->web($data)->getBody();
        }
    }

    /**
     * 支付付款查询
     * @param $out_trade_no
     * @return mixed
     * @throws \Yansongda\Pay\Exception\ContainerException
     */
    public function query($out_trade_no)
    {
        Pay::config($this->app);
        return Pay::alipay()->query(['out_trade_no' => $out_trade_no]);
    }
}